var net = require("net");
var utils = require("./utils");


const Server = net.createServer();


const ClientMap = new Map();

Server.on('connection', (sk) => {

    // 为每个客户端创建创建tcp消息暂存
    ClientMap.set(sk, null);

    sk.on('data', (buf) => {
        let new_buf = buf;
        /**
         * 收到的包的情况
         * 1、收到刚好是n个整包
         * 2、收到的n.xx个包 如果收到的是半个包需要先保存起来下次合并起来
         * 3、每个socket都要有自己的数据缓存包暂存半个包等待合并。
         */
        // 如果上一次有剩余的和本次的数据包合并
        if(ClientMap.get(sk)){
            // 包的合并
            new_buf = Buffer.concat([ClientMap.get(sk), buf], ClientMap.get(sk).length + buf.length);
        }
        

        // 循环读取
        let readOffset = 0;

        // 循环读取
        while(true){
            // 获取需要读取的长度
            const size = utils.read_pack_size(readOffset, new_buf);
            if(size && readOffset + 2 + size <= new_buf.length ){
                
                // 申请内存空间
                const ay_buf = Buffer.alloc(size);
                new_buf.copy(ay_buf, 0, readOffset + 2, readOffset + 2 + size)
                readOffset = readOffset + 2 + size;

                // clear
                ClientMap.set(sk, null);

                console.log(ay_buf.toString("utf8"))
            } else {
                // 如果上来就发了一个字节是无法读取的所以直接扔到暂存区中
                // 如果被读取了的包只存剩下每读取的部分。
                let mem = new_buf;
                if(readOffset){
                    mem = Buffer.allocUnsafe(new_buf.length - readOffset);
                    new_buf.copy(mem, 0, readOffset, new_buf.length);
                }
                ClientMap.set(sk, mem);
                break;
            }
        }

    })
})

Server.listen({
    host: '0.0.0.0',
    port: '9899'
}, () => {
    console.log('started');
})